package com.cuanbobox.utils;

import android.content.Context;
import android.content.SharedPreferences;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.List;

/**
 * 共享首选项工具类
 */
public class SharedPreferencesUtil {
    //默认保存的文件名
    public static final String DEFAULT_NAME = "ConfigSP";
    //默认集合保存的文件名
    public static final String DEFAULT_LIST_NAME = "ListConfigSP";

    /**
     * 保存key value数据到共享首选项
     *
     * @param context 上下文对象
     * @param name    保存到指定文件中
     * @param key     键
     * @param value   值
     */
    public static void save(Context context, String name, String key, Object value) {
        if (name == null) {
            name = DEFAULT_NAME;
        }
        SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        if (value instanceof String) {
            if (value == null) {
                editor.putString(key, null);
            } else {
                editor.putString(key, String.valueOf(value));
            }
        } else if (value instanceof Integer) {
            editor.putInt(key, (int) value);
        } else if (value instanceof Float) {
            editor.putFloat(key, (float) value);
        } else if (value instanceof Long) {
            editor.putLong(key, (long) value);
        } else if (value instanceof Boolean) {
            editor.putBoolean(key, (boolean) value);
        } else {
            editor.putString(key, "" + value);
        }
        editor.commit();
        editor.apply();
        editor.clear();
    }

    /**
     * 保存键值对数据到共享首选项
     *
     * @param context 上下文对象
     * @param key     键
     * @param value   值
     */
    public static void save(Context context, String key, Object value) {
        save(context, DEFAULT_NAME, key, value);
    }

    /**
     * 读取字符串数据
     *
     * @param context 上下文对象
     * @param name    保存到指定文件中
     * @param key     键
     */
    public static String getString(Context context, String name, String key) {
        if (name == null) {
            name = DEFAULT_NAME;
        }
        String result=null;
        try{
            SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);
            result=sp.getString(key, null);
        }catch (Exception e){}
        return result;
    }

    /**
     * 读取字符串数据
     *
     * @param context 上下文对象
     * @param key     键
     */
    public static String getString(Context context, String key) {
        return getString(context, DEFAULT_NAME, key);
    }

    /**
     * 读取整数数据
     *
     * @param context 上下文对象
     * @param name    保存到指定文件中
     * @param key     键
     */
    public static int getInt(Context context, String name, String key) {
        if (name == null) {
            name = DEFAULT_NAME;
        }
        int result=0;
        try{
            SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);
            result=sp.getInt(key, 0);
        }catch (Exception e){}
        return result;
    }

    /**
     * 读取整数数据
     *
     * @param context 上下文对象
     * @param key     键
     */
    public static int getInt(Context context, String key) {
        return getInt(context, DEFAULT_NAME, key);
    }

    /**
     * 读取浮点数据
     *
     * @param context 上下文对象
     * @param name    保存到指定文件中
     * @param key     键
     */
    public static float getFloat(Context context, String name, String key) {
        if (name == null) {
            name = DEFAULT_NAME;
        }
        float result=0f;
        try{
            SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);
            result=sp.getFloat(key, 0f);
        }catch (Exception e){}
        return result;
    }

    /**
     * 读取浮点数据
     *
     * @param context 上下文对象
     * @param key     键
     */
    public static float getFloat(Context context, String key) {
        return getFloat(context, DEFAULT_NAME, key);
    }

    /**
     * 读取长整型数据
     *
     * @param context 上下文对象
     * @param name    保存到指定文件中
     * @param key     键
     */
    public static long getLong(Context context, String name, String key) {
        if (name == null) {
            name = DEFAULT_NAME;
        }
        long result=0l;
        try{
            SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);
            result=sp.getLong(key, 0l);
        }catch (Exception e){}
        return result;
    }

    /**
     * 读取长整型数据
     *
     * @param context 上下文对象
     * @param key     键
     */
    public static long getLong(Context context, String key) {
        return getLong(context, DEFAULT_NAME, key);
    }

    /**
     * 读取布尔类型数据
     *
     * @param context  上下文对象
     * @param key      键
     * @param defValue 默认值
     */
    public static long getLong(Context context, String key, long defValue) {
        SharedPreferences sp = context.getSharedPreferences(DEFAULT_NAME, Context.MODE_PRIVATE);
        return sp.getLong(key, defValue);
    }

    /**
     * 读取布尔类型数据
     *
     * @param context  上下文对象
     * @param name     保存到指定文件中
     * @param key      键
     * @param defValue 默认值
     */
    public static boolean getBoolean(Context context, String name, String key, boolean defValue) {
        if (name == null) {
            name = DEFAULT_NAME;
        }
        boolean result=defValue;
        try{
            SharedPreferences sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);
            result=sp.getBoolean(key, defValue);
        }catch (Exception e){}
        return result;
    }


    /**
     * 读取布尔类型数据
     *
     * @param context  上下文对象
     * @param key      键
     * @param defValue 默认值
     */
    public static boolean getBoolean(Context context, String key, boolean defValue) {
        return getBoolean(context, DEFAULT_NAME, key, defValue);
    }

    /**
     * 保存一个对象
     *
     * @param context 上下文对象
     * @param bean    要保存的对象
     */
    public static void saveBean(Context context, Object bean) {
        try{
            String json = new Gson().toJson(bean);
            save(context, DEFAULT_LIST_NAME, bean.getClass().getSimpleName(), json);
        }catch (Exception e){
            LogUtil.addError("---------SharedPreferencesUtil.saveBean()异常-----------");
            LogUtil.addError("传入实体类bean的类名="+bean.getClass().getSimpleName());
            LogUtil.addError("bean.toString()="+bean.toString());
            LogUtil.addError("-------------------------------------------------------");
        }

    }

    /**
     * 读取一个对象
     *
     * @param context 上下文对象
     * @param cls     实体类的类型
     */
    public static Object getBean(Context context, Class cls) {
        String json = getString(context, DEFAULT_LIST_NAME, cls.getSimpleName());
        return new Gson().fromJson(json, cls);
    }

    /**
     * 保存集合数据
     *
     * @param context 上下文对象
     * @param key     键
     * @param list    集合
     */
    public static void saveList(Context context, String key, List<?> list) {
        String json = new Gson().toJson(list);
        save(context, DEFAULT_LIST_NAME, key, json);
    }

    /**
     * 读取集合数据
     *
     * @param context   上下文对象
     * @param key       键
     * @param typeToken 要解析的集合数据类型，比如创建一个字符串集合的数据类型写法：new TypeToken<List<String>>() {}
     */
    public static List<?> getList(Context context, String key, TypeToken typeToken) {
        String json = getString(context, DEFAULT_LIST_NAME, key);
        return new Gson().fromJson(json, typeToken.getType());
    }

    /**
     * 读取字符串集合数据
     *
     * @param context 上下文对象
     * @param key     键
     */
    public static List<String> getStringList(Context context, String key) {
        String json = getString(context, DEFAULT_LIST_NAME, key);
        return new Gson().fromJson(json, new TypeToken<List<String>>() {
        }.getType());
    }

    /**
     * 读取整数集合数据
     *
     * @param context 上下文对象
     * @param key     键
     */
    public static List<Integer> getIntegerList(Context context, String key) {
        String json = getString(context, DEFAULT_LIST_NAME, key);
        return new Gson().fromJson(json, new TypeToken<List<Integer>>() {
        }.getType());
    }
}
